/*
* jQuery Messi Plugin 1.3
* https://github.com/marcosesperon/jquery-messi
*
* Copyright 2012, Marcos Esperón
* http://marcosesperon.es
*
* Licensed under the MIT license:
* http://www.opensource.org/licenses/MIT
*/
// Clase principal
function Messi(data, options) {
var _this = this;
_this.options = jQuery.extend({}, Messi.prototype.options, options || {});
// preparamos el elemento
_this.messi = jQuery(_this.template);
_this.setContent(data);
// ajustamos el título
if(_this.options.title == null) {
jQuery('.messi-titlebox', _this.messi).remove();
} else {
jQuery('.messi-title', _this.messi).append(_this.options.title);
if(_this.options.buttons.length === 0 && !_this.options.autoclose) {
if(_this.options.closeButton) {
var close = jQuery('');
close.bind('click', function() {
_this.hide();
});
jQuery('.messi-titlebox', this.messi).prepend(close);
};
};
if(_this.options.titleClass != null) jQuery('.messi-titlebox', this.messi).addClass(_this.options.titleClass);
};
// ajustamos el ancho
if(_this.options.width != null) jQuery('.messi-box', _this.messi).css('width', _this.options.width);
// preparamos los botones
if(_this.options.buttons.length > 0) {
for (var i = 0; i < _this.options.buttons.length; i++) {
var cls = (_this.options.buttons[i]["class"]) ? _this.options.buttons[i]["class"] : '';
var btn = jQuery('
').data('value', _this.options.buttons[i].val);
btn.on('click', 'button', function() {
var value = jQuery.data(this, 'value');
var after = (_this.options.callback != null) ? function() { _this.options.callback(value); } : null;
_this.hide(after);
});
jQuery('.messi-actions', this.messi).append(btn);
};
} else {
jQuery('.messi-footbox', this.messi).remove();
};
// preparamos el botón de cerrar automáticamente
if(_this.options.buttons.length === 0 && _this.options.title == null && !_this.options.autoclose) {
if(_this.options.closeButton) {
var close = jQuery('');
close.bind('click', function() {
_this.hide();
});
jQuery('.messi-content', this.messi).prepend(close);
};
};
// activamos la pantalla modal
_this.modal = (_this.options.modal) ? jQuery('').css({opacity: _this.options.modalOpacity, width: jQuery(document).width(), height: jQuery(document).height(), 'z-index': _this.options.zIndex + jQuery('.messi').length}).appendTo(document.body) : null;
// mostramos el mensaje
if(_this.options.show) _this.show();
// controlamos el redimensionamiento de la pantalla
jQuery(window).bind('resize', function(){ _this.resize(); });
// configuramos el cierre automático
if(_this.options.autoclose != null) {
setTimeout(function(_this) {
_this.hide();
}, _this.options.autoclose, this);
};
return _this;
};
Messi.prototype = {
options: {
autoclose: null, // autoclose message after 'x' miliseconds, i.e: 5000
buttons: [], // array of buttons, i.e: [{id: 'ok', label: 'OK', val: 'OK'}]
callback: null, // callback function after close message
center: true, // center message on screen
closeButton: true, // show close button in header title (or content if buttons array is empty).
height: 'auto', // content height
title: null, // message title
titleClass: null, // title style: info, warning, success, error
modal: false, // shows message in modal (loads background)
modalOpacity: .2, // modal background opacity
padding: '10px', // content padding
show: true, // show message after load
unload: true, // unload message after hide
viewport: {top: '0px', left: '0px'}, // if not center message, sets X and Y position
width: '500px', // message width
zIndex: 99999 // message z-index
},
template: '',
content: '',
visible: false,
setContent: function(data) {
jQuery('.messi-content', this.messi).css({padding: this.options.padding, height: this.options.height}).empty().append(data);
},
viewport: function() {
return {
top: ((jQuery(window).height() - this.messi.height()) / 2) + jQuery(window).scrollTop() + "px",
left: ((jQuery(window).width() - this.messi.width()) / 2) + jQuery(window).scrollLeft() + "px"
};
},
show: function() {
if(this.visible) return;
if(this.options.modal && this.modal != null) this.modal.show();
this.messi.appendTo(document.body);
// obtenemos el centro de la pantalla si la opción de centrar está activada
if(this.options.center) this.options.viewport = this.viewport(jQuery('.messi-box', this.messi));
this.messi.css({top: this.options.viewport.top, left: this.options.viewport.left, 'z-index': this.options.zIndex + jQuery('.messi').length}).show().animate({opacity: 1}, 300);
// cancelamos el scroll
//document.documentElement.style.overflow = "hidden";
this.visible = true;
},
hide: function(after) {
if (!this.visible) return;
var _this = this;
this.messi.animate({opacity: 0}, 300, function() {
if(_this.options.modal && _this.modal != null) _this.modal.remove();
_this.messi.css({display: 'none'}).remove();
// reactivamos el scroll
//document.documentElement.style.overflow = "visible";
_this.visible = false;
if (after) after.call();
if(_this.options.unload) _this.unload();
});
return this;
},
resize: function() {
if(this.options.modal) {
jQuery('.messi-modal').css({width: jQuery(document).width(), height: jQuery(document).height()});
};
if(this.options.center) {
this.options.viewport = this.viewport(jQuery('.messi-box', this.messi));
this.messi.css({top: this.options.viewport.top, left: this.options.viewport.left});
};
},
toggle: function() {
this[this.visible ? 'hide' : 'show']();
return this;
},
unload: function() {
if (this.visible) this.hide();
jQuery(window).unbind('resize', function () { this.resize(); });
this.messi.remove();
},
};
// llamadas especiales
jQuery.extend(Messi, {
alert: function(data, callback, options) {
var buttons = [{id: 'ok', label: 'OK', val: 'OK'}];
options = jQuery.extend({closeButton: false, buttons: buttons, callback:function() {}}, options || {}, {show: true, unload: true, callback: callback});
return new Messi(data, options);
},
ask: function(data, callback, options) {
var buttons = [
{id: 'yes', label: 'Yes', val: 'Y', "class": 'btn-success'},
{id: 'no', label: 'No', val: 'N', "class": 'btn-danger'},
];
options = jQuery.extend({closeButton: false, modal: true, buttons: buttons, callback:function() {}}, options || {}, {show: true, unload: true, callback: callback});
return new Messi(data, options);
},
img: function(src, options) {
var img = new Image();
jQuery(img).load(function() {
var vp = {width: jQuery(window).width() - 50, height: jQuery(window).height() - 50};
var ratio = (this.width > vp.width || this.height > vp.height) ? Math.min(vp.width / this.width, vp.height / this.height) : 1;
jQuery(img).css({width: this.width * ratio, height: this.height * ratio});
options = jQuery.extend(options || {}, {show: true, unload: true, closeButton: true, width: this.width * ratio, height: this.height * ratio, padding: 0});
new Messi(img, options);
}).error(function() {
console.log('Error loading ' + src);
}).attr('src', src);
},
load: function(url, options) {
options = jQuery.extend(options || {}, {show: true, unload: true, params: {}});
var request = {
url: url,
data: options.params,
dataType: 'html',
cache: false,
error: function (request, status, error) {
console.log(request.responseText);
},
success: function(html) {
//html = jQuery(html);
new Messi(html, options);
}
};
jQuery.ajax(request);
}
});